Apache Tika 是一個內容分析工具,支援多種檔案格式辨別,並且可以提取檔案內部的相關內容,所以在搜尋引擎、翻譯、內容分析等許多方面被廣泛的使用。除了與Java整合之外,也另外提供CLI的介面供使用者使用。
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>${tika-core.version}</version>
</dependency>
public MediaType getTikaMediaType(MultipartFile multipartFile) {
byte[] bytes = multipartFile.getBytes();
TikaConfig tikaConfig = new TikaConfig();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
TikaInputStream tikaInputStream = TikaInputStream.get(byteArrayInputStream);
return tikaConfig.getDetector().detect(tikaInputStream, new Metadata());
}
BufferedImage是imageio處理圖片的物件,裡面會有兩個組成ColorModel、Raster,ColorModel定義了這張圖片的色彩能力、檔案類型等,而Raster中有兩個主要元件SampleModel、Databuffer,SampleModel決定了如何存取某個位置的顏色方法,而Databuffer就是儲存原本圖片的Raw Data
從spring mvc接收MultipartFile,建立ImageInputStream,取得ImageReader來判別是否能生成物件(是否是圖片)
public boolean isImage(MultipartFile multipartFile) {
boolean isImage = false;
byte[] bytes = multipartFile.getBytes();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
ImageInputStream imageInputStream = ImageIO.createImageInputStream(byteArrayInputStream);
Iterator<ImageReader> iter = ImageIO.getImageReaders(imageInputStream);
if (iter.hasNext()) {
isImage = true;
}
return isImage;
}
不論是透過Tika或是Java的imageio,都可以辨別是否檔案為圖片,但如果需要圖片的更多細節,可以從Tika的Metadata取得,使用上比起imageio來的順手,也能在用戶上傳檔案前多一層辨別和阻擋